package threadTest;

/**
 * @Author: insight
 * @Version: sync_wait_notify_version_1
 * @Description: 练习两个线程交替运行 此种写法存在两种输出情况(坑),因为没有办法确定哪个线程先运行
 * @LastDate: 2020年9月27日上午10:52:28
 */
public class ThreadTest01_sync_wait_notify {

    public static void main(String[] args) {
        char[] a1 = "123456".toCharArray();
        char[] a2 = "ABCDEF".toCharArray();
        //定义一把对象锁
        final Object o = new Object();


        new Thread(() -> {
            synchronized (o) {
				// 实现某个线程优先运行 这个写法不可靠
				/*try { o.wait(); } catch (InterruptedException e1) { e1.printStackTrace(); }*/
                for (var c : a1) {
                    System.out.print(c);
                    try {
                        o.notify();
                        o.wait();
                    } catch (Exception e) {
                        e.printStackTrace();

                    }
                }
                o.notify(); //最后必须唤醒 否则程序不会停止 因为打印结束之后 总有一个线程执行了wait 如果没有人去唤醒 程序就不会结束
            }
        }, "t1").start();

        new Thread(() -> {
            synchronized (o) {

                for (var c : a2) {
                    System.out.print(c);
                    try {
                        o.notify();
                        o.wait();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                o.notify();
            }
        }, "t1").start();
    }
}
